package com.bit.mybatis.mapper;

import com.bit.mybatis.modle.UserInfo;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface UserInfoMapper {
    @Select("select * from user_info")
        //此处的更新操作会难以进行完成，由于Sql的命名规则同java的命名规则不同；
        //因此需要进行参数之间的一一对应；
        //方法一：进行使用SQL中的查询时:定义别名的方法进行查询；
//    @Select("select id, username,`password`, age, gender,  phone, " +
//            "delete_flag as deleteFlag, create_time as createTime, update_time as updateTime" +
//         " from user_info")
    //方法二：进行使用；results和result两个注解进行相关的属性的设置；
    //注意此方法需要结合 @Select("select * from user_info")共同进行使用；
    @Results(id="BaseMap",value = {
            @Result(column = "delete_flag",property = "deleteFlag"),
            @Result(column = "create_time",property = "createTime"),
            @Result(column = "update_time",property = "updateTime")
    })
    //方法三：进行相关配置文件的设置；
    //将SQL中的蛇性命名法变成驼峰命名法；
    List<UserInfo> selectAll();
    //进行传入一个·1参数的正确使用；
    @Select("select * from user_info where id=#{id}")
    UserInfo userAllById(Integer id);

    @Select("select * from user_info where id=#{id}")
    List<UserInfo> userAllById2(Integer id);
    //进行即时SQL语法的观察与练习：（$);
    @Select("select * from user_info where id=${id}")
    List<UserInfo> userAllById3(Integer id);
    //进行传入两个参数的正确使用；
    @Select("select * from user_info where username=#{username} and password=#{password}")
    List<UserInfo> selectUserNameAndPassword(String username,String password);
    //进行传入两个参数是参数位置的切换，验证是否会影响执行结果；
    @Select("select * from user_info where username=#{username} and password=#{password}")
    List<UserInfo> selectUserNameAndPassword2(String password,String username);
    //进行传入两个参数的时候进行使用相关注解规定查询的名字的重命名；
    @Select("select * from user_info where username=#{userName} and password=#{passWord}")
    List<UserInfo>  selectUserNameAndPassword3(@Param("passWord") String password,@Param("userName") String username);
    //进行即时SQL语法的测试使用;进行使用到($);
    @Select("select * from user_info where username='${username}' and password='${password}'")
    List<UserInfo> selectUserNameAndPassword4(String username,String password);
    //进行对象的传入；
    @Options(useGeneratedKeys = true,keyProperty = "id")
    //这个Options这个注解用于获取id的不断变化；
    //有了这个注解可以进行正确获取getID的值；
    @Insert("insert into user_info (username,password,age) values (#{username},#{password},#{age})")
    Integer insertUser(UserInfo userInfo);
    //在mybatis中若一行语句过长，可以进行使用字符串中“+”进行分割分多行进行正确使用；
    //当进行在对象的传入时，进行重命名时：我们需要进行正确指定接收参数的格式；
    //进行可选项的相关选择；
    //进行动态SQL的相关代码的增加；
//    @Insert("insert into user_info (username,password,age) values (#{username},#{password},#{age})")
//    Integer insertUser(UserInfo userInfo);
    @Options(useGeneratedKeys = true,keyProperty = "id")
    @Insert("insert into"+
            "user_info (username,password,age)"+
            "values (#{userInfo.username},#{userInfo.password},#{userInfo.age})")
    Integer insertUser2(@Param("userInfo") UserInfo userInfo);
    //进行删除操作；
    @Delete("delete from user_info where id=#{id}")
    Integer deleteUser(Integer id);
    //进行更新操作；
    @Update("update user_info set delete_flag=#{deleteFlag},phone=#{phone} where id=#{id}")
    Integer updateUser(UserInfo userInfo);
    //进行SQL中排序功能的实践；
    //需要要到即时编译中的$,进行相关的操作；
    @Select("select * from user_info  order by id ${order}")
    List<UserInfo> selelctUserInfoByorder(String order);
    //进行SQL中模糊查询的相关实现；
    //需要注意的相关问题：1.进行使用#，这种预编译的方式，达不到我们想要的效果；
    //                 2.进行使用$,这种即时编译方法，会存在SQL注入相关的漏洞，容易出现相关的bug；
    //                 3.正确的解决办法：使用SQL的库函数进行完成相关的操作；
    ///////////////////即：concat();
    @Select("select * from user_info where username like concat('%',#{userName},'%')")
    List<UserInfo> selectUserInfoByLike(String userName);





}
